/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * CodeForm.java
 *
 * Created on 28.09.2010, 15:13:39
 */

package vizzy.forms.panels;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
import org.apache.log4j.Logger;
import vizzy.model.Conf;
import vizzy.util.StringUtils;

/**
 *
 * @author sergeil
 */
public class CodeForm extends JPanel {
    private static final Logger log = Logger.getLogger(CodeForm.class);

    private int highlightedLinePos;

    /** Creates new form CodeForm */
    public CodeForm() {
        setBackground(null);
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jCodeTextPane = new vizzy.comp.NoWordWrapTextPane();

        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0), 3));

        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setViewportView(jCodeTextPane);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 189, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 129, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTextPane jCodeTextPane;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration//GEN-END:variables

    public void updateSize(int height) {
        Dimension dim = jCodeTextPane.getPreferredScrollableViewportSize();
        jCodeTextPane.setPreferredSize(dim);
        int w = Math.max(Math.min(400, dim.width) + 50, 100);
        dim = new Dimension(w
                + jScrollPane1.getVerticalScrollBar().getPreferredSize().width,
                height);
        setPreferredSize(dim);
        setBounds(0, 0, dim.width, dim.height);
    }

    public void initStyles(Font font, Color foreground, Color background) {
        StyledDocument doc = jCodeTextPane.getStyledDocument();
        Style def = StyleContext.getDefaultStyleContext().
                getStyle(StyleContext.DEFAULT_STYLE);
        Style boldStyleName = doc.addStyle("bold", def);
        StyleConstants.setBold(boldStyleName, true);
        StyleConstants.setForeground(boldStyleName, Color.RED);
        jCodeTextPane.setFont(font);
        jCodeTextPane.setForeground(foreground);
        jCodeTextPane.setBackground(background);
    }

    public void setText(List<String> lines, int boldLineNum) {
        try {
            StyledDocument doc = jCodeTextPane.getStyledDocument();
            highlightedLinePos = -1;
            for (int i = 0; i < lines.size(); i++) {
                String line = lines.get(i) + Conf.newLine;
                if (i == boldLineNum) {
                    highlightedLinePos = doc.getLength();
                    doc.insertString(highlightedLinePos, line, doc.getStyle("bold"));
                    highlightedLinePos += (line.length() - StringUtils.trimStart(line).length());
                } else {
                    int len = doc.getLength();
                    doc.insertString(len, line, doc.getStyle("regular"));
                }
            }
        } catch (BadLocationException ex) {
//            log.warn("setText()", ex);
        }
    }

    public void initUI() {
        jCodeTextPane.requestFocus();
    }

    public void scrollText() {
        if (highlightedLinePos != -1) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
                        Rectangle rect = jCodeTextPane.modelToView(highlightedLinePos);
                        jScrollPane1.getHorizontalScrollBar().setValue((int) (rect.getX() / 3 * 2));
                        jScrollPane1.getVerticalScrollBar().setValue((int) (rect.getY() - getHeight() / 2));
                    } catch (BadLocationException ex) {
//                            log.warn("cannot scroll text, scrollText()", ex);
                    }
                }
            });
        }
    }

    public void setFocus() {
        jCodeTextPane.requestFocus();
    }

    public void setText(String content) {
        jCodeTextPane.setText(content);
    }

}
